home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1985-12-29 | 12.8 KB | 297 lines |
- 2 '===========================================================================
- 3 ' GLYPHE-A CHARACTER GRAPHICS EDITOR FOR THE IBM PC
- 4 ' *REQUIREMENTS-ONE DISK DRIVE,MONOCHROME OR
- 5 ' COLOR DISPLAY.A MODIFIED PRINTER DRIVER IS
- 6 ' NEEDED TO PRINT THE PC`S CHARACTER GRAPHICS.
- 7 ' AUTHOR- CHARLES B. DUFF 03/6/83
- 8 '===========================================================================
- 10 DEFINT A-Z:ON ERROR GOTO 20000
- 30 FOR I=1 TO 10:KEY I,"":NEXT 'TURN OFF FUNCTION KEY DEFINITIONS
- 50 KEY OFF 'ERASE 25TH LINE KEY HELP DISPLAY
- 70 DIM SCN$(88)
- 90 PIK$=SPACE$(80) 'PICK BUFFER
- 100 TOF$=CHR$(12):LPI8$=CHR$(27)+"0":LPI6$=CHR$(27)+"2" 'CODES FOR MX-80
- 110 DIM DIAM$(10),BOX$(5),CRT$(6),SBOX$(4) 'DIAMOND,BOX AND SCREEN FIG.S
- 150 COORD$="<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>o<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>1<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>o<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>2<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>o<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>3<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>o<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>"+CHR$(127)+"<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>o<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>5<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>o<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>6<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>o<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>7<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>o<UNK! {00FA}><UNK! {00FA}><UNK! {00FA}><UNK! {00FA}>"
- 170 DIAM$(1)=" ^" :BOX$(1)=" DELETE----------AUTO":SBOX$(1)=" DELETE-----AUTO"
- 190 DIAM$(2)=" / \" :BOX$(2)="| |":SBOX$(2)="| |"
- 210 DIAM$(3)=" / \" :BOX$(3)="| |":SBOX$(3)="| |"
- 230 DIAM$(4)=" / \" :BOX$(4)="| |":SBOX$(4)=" CLS-----'"
- 250 DIAM$(5)="< >" :BOX$(5)=" CLS----------' "
- 270 DIAM$(6)=" \ /" :CRT$(1)=" DELETEDELETE--------AUTOAUTO "
- 290 DIAM$(7)=" \ /" :CRT$(2)="|| ||"
- 310 DIAM$(8)=" \ / " :CRT$(3)="|| ||"
- 330 DIAM$(9)=" v" :CRT$(4)="|| ||"
- 340 NU$=CHR$(0): :CRT$(5)="|| ||"
- 344 :CRT$(6)="CLSCLS----------''"
- 346 LINES=88 'MAX LINES IN EDITOR:88= 1 PRINTED PAGE AT 8 LP:
- 350 '==========================================================================
- 370 'PROMPT FOR FILES AND ENTER MAIN EDIT LOOP
- 390 '===========================================================================
- 400 CLS:PRINT" GLYPHE (C) Copyright 1983,Charles B. Duff"
- 404 PRINT:PRINT:
- 410 FILES:PRINT:PRINT:INPUT "Input image file";IM$
- 430 INPUT "Output image file";OM$:CLS
- 440 IF OM$="" THEN OM$=IM$:IF OM$="" THEN CLOSE:CHAIN "b:graphics.bas" 'OUTPUT DEFAULTS TO IN
- 450 IF IM$="" THEN 570 'IF NO ENTRY THEN DON't open input file
- 470 OPEN IM$ AS #1 LEN=80:IF LOF(1)=0 THEN CLOSE:GOTO 570 'OPEN INPUT
- 490 FIELD #1,80 AS IL$ '80 CHR. TEXT FIELD
- 510 FOR LIN=1 TO LINES 'FILL BUFFER
- 530 GET #1,LIN:SCN$(LIN)=IL$
- 550 NEXT LIN
- 570 GMOD=1:SCOLD=1:SCNUM=1:GOSUB 1730 'DISPLAY THE FIRST PAGE
- 590 LOCATE 1,1,1 'HOME AND TURN ON THE CURSOR
- 610 GOSUB 2270 'PRINT SLAVE CURSOR ON 25TH LINE
- 630 A$=INKEY$:IF A$="" THEN 630 'GET A CHR.
- 650 IF LEN(A$)=2 THEN 710 'IF FUNCTION OR SPECIAL FUNCTION KEY
- 660 IF A$=CHR$(27) THEN GOSUB 3690:GOTO 610
- 670 IF A$=CHR$(13) AND CSRLIN=24 THEN GOSUB 3470:GOTO 610 'SCROLL
- 680 IF A$=CHR$(9) AND POS(0)<72 THEN LOCATE CSRLIN,POS(0)+8:GOTO 610
- 690 GOSUB 3770:PRINT A$;:OA$=A$:GOTO 610 'UPDATE BUFFER,DISPLAY AND LOOP
- 710 AV=ASC(MID$(A$,2,1)) 'GET ASCII VALUE OF 2ND CHR.
- 712 '========================================================================
- 730 IF AV<71 THEN 1120 ELSE IF (AV>83 AND AV<115) THEN 1320 'IF FN KEY
- 750 ON AV-70 GOTO 810,830,870,610,930,610,950,610,1550,970,1090,1050,1010
- 790 GOTO 610
- 810 LOCATE 1,1:GOTO 610
- 830 IF CSRLIN>1 THEN LOCATE CSRLIN-1,POS(0):GOTO 610 'UP ARROW
- 850 GOTO 610
- 870 SCOLD=SCNUM:IF SCNUM>16 THEN SCNUM=SCNUM-16 ELSE SCNUM=1 'PG UP
- 890 GOSUB 1730:GOTO 610 'DISPLAY NEW PAGE
- 930 PRINT CHR$(29);:GOTO 610 'LEFT ARROW
- 950 PRINT CHR$(28);:GOTO 610 'RIGHT ARROW
- 970 IF CSRLIN<24 THEN LOCATE CSRLIN+1,POS(0):GOTO 610 'DOWN ARROW
- 990 GOTO 610
- 1010 GOSUB 2370:GOSUB 2550 `DELETE A CHR.
- 1030 GOTO 610
- 1050 GOSUB 2690:GOSUB 2550 `INSERT CHR.
- 1070 GOTO 610
- 1090 SCOLD=SCNUM:IF SCNUM<LINES-38 THEN SCNUM=SCNUM+16 ELSE SCNUM=LINES-23
- 1110 GOSUB 1730:GOTO 610 'PG DN-DISPLAY NEW PG.
- 1112 '=======================================================================
- 1120 IF AV<59 THEN 610 'THIS SECTION HANDLES F1-F10
- 1130 ON AV-58 GOTO 1140,1160,1180,1200,1220,1240,1260,1280,1300,1310
- 1132 GOTO 610
- 1140 A$=CHR$(218):GOTO 690 'FC 1-10 ARE GRAPHICS CHARACTERS
- 1160 A$="COLOR":GOTO 690 'FOR BUILDING TABLES,GRAPHS,ETC.
- 1180 A$="CLS":GOTO 690
- 1200 A$="'":GOTO 690
- 1220 A$="CALL":GOTO 690
- 1240 A$="SOUND":GOTO 690
- 1260 A$="BLOAD":GOTO 690
- 1280 A$="<0xB4!>":GOTO 690
- 1300 A$="MOTOR":GOTO 690
- 1310 A$="BSAVE":GOTO 690
- 1314 '=======================================================================
- 1320 IF AV>93 THEN 1480 'THIS SECTION HANDLES F11-F20
- 1322 ON AV-83 GOTO 1328,1330,1350,1370,1390,1410,1430,1450,1460,1470
- 1328 INSLIN=CSRLIN+SCNUM-1:GOSUB 3210:SCN$(INSLIN)=SPACE$(80):GOSUB 3890:GOTO 610 'INSERT LINE
- 1330 GOSUB 3310:GOSUB 3890:GOTO 610 'DELETE LINE
- 1350 GOSUB 3090:GOTO 610 'DROP
- 1370 GOSUB 2930:GOTO 610 'PICK
- 1390 GOSUB 4010:GOTO 610 'BOX
- 1410 GOSUB 4210:GOTO 610 'DIAMOND
- 1430 GOSUB 1570:GOTO 610 'save to disk
- 1450 GOSUB 5200:GOTO 610 'small box
- 1460 A$="<UNK! {FE22}>:GOTO 690
- 1470 A$="BEEP":GOTO 690
- 1472 '======================================================================
- 1480 IF AV>103 THEN 1520 'THIS SECTION HANDLES F21-30
- 1484 ON AV-93 GOTO 1490,1500,1510 'ROOM FOR EXPANSION
- 1486 GOTO 610
- 1490 GOSUB 4510:GOTO 610 'CRT SCREEN FIG.
- 1500 A$=OA$:GOTO 650 'F22 REMEMBERS LAST KEY PRESSES
- 1510 LOCATE 25,1:INPUT;"enter graphic mode (1=on, 0=off)";GMOD
- 1515 GOSUB 2150:GOTO 610
- 1518 '======================================================================
- 1520 IF AV=114 THEN GOSUB 5000:GOTO 610 'CTRL-PRT SC
- 1530 GOTO 610
- 1550 GOSUB 1570:COLOR 7,0:CLS:END 'END WAS PRESSED-SAVE AND EXIT
- 1570 OPEN OM$ AS #2 LEN=80 'WRITE IMAGE TO DISK
- 1590 FIELD #2,80 AS OL$ 'OPEN RANDOM OUTPUT FILE RECL=80
- 1610 FOR LIN=1 TO LINES
- 1630 LSET OL$=SCN$(LIN)
- 1650 PUT #2,LIN
- 1670 NEXT LIN
- 1690 CLOSE #2:CLOSE #1
- 1710 CHAIN "b:graphics.bas"
- 1712 '***********************************************************************
- 1720 'begin subroutine code
- 1730 '=========================================================================
- 1750 'display screen given by scnum
- 1770 '=========================================================================
- 1790 CP=POS(0):CL=CSRLIN 'pickup cursor column and line
- 1810 CLS:GOSUB 2190
- 1830 FOR SCL=1 TO 23
- 1850 LOCATE SCL,1,0:PRINT SCN$(SCNUM+SCL-1);
- 1870 NEXT SCL
- 1890 LOCATE 24,1:PRINT MID$(SCN$(SCNUM+23),1,79);
- 1910 LOCATE CL,CP,1:RETURN 'restore cursor and return
- 2130 '=======================================================================
- 2150 '*print coordinates on 25th line
- 2170 '=======================================================================
- 2190 LOCATE 25,1:PRINT COORD$;
- 2210 RETURN
- 2230 '========================================================================
- 2250 '*print slave cursor at current column and current line indicator
- 2270 '========================================================================
- 2290 NCP=POS(0):NL=CSRLIN:LOCATE 25,CP,0:PRINT MID$(COORD$,CP,1);
- 2310 IF NCP<80 THEN LOCATE 25,NCP,0:COLOR 8,7:PRINT CHR$(127);
- 2330 LOCATE 25,1:PRINT USING "##";NL+SCNUM-1;:COLOR 7,0
- 2350 LOCATE NL,NCP,1:CP=NCP:RETURN
- 2370 '=========================================================================
- 2390 'delete a chr. from the current line
- 2410 '========================================================================
- 2430 SC=SCNUM+CSRLIN-1:CP=POS(0)
- 2470 SCN$(SC)=LEFT$(SCN$(SC),CP-1)+RIGHT$(SCN$(SC),80-CP)+" "
- 2530 RETURN
- 2550 '=======================================================================
- 2570 '*print the current line from screen buffer
- 2590 '=======================================================================
- 2610 CP=POS(0):CL=CSRLIN
- 2630 SC=SCNUM+CL-1:IF CL=24 THEN 2670
- 2650 LOCATE CL,1,0:PRINT SCN$(SC);:LOCATE CL,CP,1:RETURN
- 2670 LOCATE 24,1,0:PRINT MID$(SCN$(SC),1,79);:LOCATE CL,CP,1:RETURN
- 2690 '=======================================================================
- 2710 '*inset a space in current line
- 2730 '=======================================================================
- 2750 SC=SCNUM+CSRLIN-1:CP=POS(0)
- 2790 SCN$(SC)=LEFT$(SCN$(SC),CP-1)+" "+MID$(SCN$(SC),CP,80-CP)
- 2870 RETURN
- 2890 '=======================================================================
- 2910 '*pick a line from scn$ to the pick buffer
- 2930 '=======================================================================
- 3010 PIK$=SCN$(CSRLIN+SCNUM-1)
- 3030 RETURN
- 3050 '======================================================================
- 3070 '*drop a line to the screen(insert)
- 3090 '======================================================================
- 3110 SC=CSRLIN+SCNUM-1:IF SC>LINES THEN RETURN
- 3130 INSLIN=SC:GOSUB 3210
- 3150 SCN$(SC)=PIK$:GOSUB 3830:RETURN
- 3170 '=====================================================================
- 3190 '*move lines down in scn$ for insert
- 3210 '======================================================================
- 3230 FOR LIN=LINES TO INSLIN+1 STEP -1
- 3250 SCN$(LIN)=SCN$(LIN-1)
- 3270 NEXT LIN
- 3290 RETURN
- 3310 '======================================================================
- 3330 '*delete a line from the screen
- 3350 '=======================================================================
- 3370 SC=CSRLIN+SCNUM-1
- 3390 FOR LIN=SC TO LINES-1
- 3410 SCN$(LIN)=SCN$(LIN+1)
- 3430 NEXT LIN
- 3450 SCN$(LINES)=SPACE$(80):RETURN
- 3470 '=======================================================================
- 3490 'handle a scroll from a cr on line 24
- 3510 '=======================================================================
- 3590 IF SCNUM>LINES-24 THEN LOCATE 24,1,1:RETURN
- 3610 PRINT A$;:LOCATE 24,1,0:PRINT MID$(SCN$(SCNUM+24),1,79);
- 3630 SCNUM=SCNUM+1:GOSUB 2270:LOCATE 24,1,1:RETURN
- 3650 '======================================================================
- 3670 '*ESC TO QUIT WITHOUT SAVE
- 3690 '=======================================================================
- 3700 CP=POS(0):CL=CSRLIN 'SAVE CURSOR POSITION
- 3710 LOCATE 25,1:INPUT;"Quit without saving (Y or N)";ANS$
- 3730 IF ANS$="Y" OR ANS$="y" THEN CLS:CHAIN "b:graphics.bas"
- 3750 GOSUB 2170:LOCATE CL,CP:RETURN
- 3770 '======================================================================
- 3780 '*update buffer with character entered, and
- 3784 '*handle a scroll if at 24.80 and not beyond
- 3786 '*the end of the screen buffer. add 127 to code if graphics mode
- 3788 '=====================================================================
- 3789 AV=ASC(A$):IF GMOD=1 AND AV<>13 AND AV<>32 AND AV<127 THEN A$=CHR$(AV+127)
- 3790 IF A$<>CHR$(13) THEN MID$(SCN$(SCNUM+CSRLIN-1),POS(0),1)=A$
- 3800 IF CSRLIN<24 OR POS(0)<80 THEN RETURN
- 3804 IF SCNUM>LINES-24 THEN RETURN
- 3806 SCNUM=SCNUM+1:RETURN
- 3810 RETURN
- 3830 '=======================================================================
- 3850 '*print screen from current line down
- 3870 '=======================================================================
- 3890 CP=POS(0):CL=CSRLIN
- 3910 FOR LIN=CL TO 23
- 3930 LOCATE LIN,1:PRINT SCN$(SCNUM+LIN-1);
- 3950 NEXT LIN
- 3970 LOCATE 24,1:PRINT MID$(SCN$(SCNUM+23),1,79);
- 3990 LOCATE CL,CP:RETURN
- 4010 '=======================================================================
- 4030 '*print a box with top center at cursor
- 4050 '========================================================================
- 4070 SC=SCNUM+CSRLIN-1:
- 4090 IF POS(0)<(LEN(BOX$(1))/2)+1 THEN RETURN
- 4110 CP=POS(0)-(LEN(BOX$(1))/2)
- 4130 FOR LIN=1 TO 5:IF SC+LIN-1=LINES+1 THEN 4190
- 4150 MID$(SCN$(SC+LIN-1),CP,LEN(BOX$(1)))=BOX$(LIN)
- 4170 NEXT LIN
- 4190 GOSUB 3870:RETURN
- 4210 '======================================================================
- 4230 '*print a diamond with top at cursor
- 4250 '======================================================================
- 4270 SC=SCNUM+CSRLIN-1
- 4290 IF POS(0)<LEN(DIAM$(5))/2 THEN RETURN
- 4310 CP=POS(0)-(LEN(DIAM$(5))/2)
- 4330 FOR LIN=1 TO 9:IF SC+LIN-1=LINES+1 THEN 4390
- 4350 MID$(SCN$(SC+LIN-1),CP,LEN(DIAM$(5)))=DIAM$(LIN)
- 4370 NEXT LIN
- 4390 GOSUB 3870:RETURN
- 4510 '=====================================================================
- 4530 '*print a crt screen with top center at cursor
- 4550 '====================================================================
- 4570 SC=SCNUM+CSRLIN-1
- 4590 IF POS(0)<(LEN(CRT$(1))/2)+1 THEN RETURN
- 4610 CP=POS(0)-(LEN(CRT$(1))/2)
- 4630 FOR LIN=1 TO 6:IF SC+LIN-1=LINES+1 THEN 4690
- 4650 MID$(SCN$(SC+LIN-1),CP,LEN(CRT$(1)))=CRT$(LIN)
- 4670 NEXT LIN
- 4690 GOSUB 3870:RETURN
- 5000 '======================================================================
- 5010 '*print the contents of the screen buffer
- 5020 '*on the printer
- 5030 '======================================================================
- 5032 LPRINT LPI8$+TOF$; '(mx) set 8 lpi,top of form
- 5040 FOR LIN=1 TO LINES
- 5044 IF INKEY$="" THEN 5050
- 5046 CP=POS(0):CL=CSRLIN:LOCATE 25,1:INPUT;"Quit printing (y or n)";ANS$
- 5048 GOSUB 2170:LOCATE CL,CP:IF ANS$="y" OR ANS$+"Y" THEN 5070
- 5050 LPRINT SCN$(LIN);
- 5060 NEXT LIN
- 5070 LPRINT LPI6$; 'restore 6 lpi
- 5080 RETURN
- 5200 '======================================================================
- 5220 '*print a small bow with top center at cursor
- 5240 '======================================================================
- 5280 SC=SCNUM+CSRLIN-1
- 5300 IF POS(0)<(LEN(SBOX$(1))/2)+1 THEN RETURN 'check if off scrn
- 5320 CP=POS(0)-(LEN(SBOX$(1))/2)
- 5340 FOR LIN=1 TO 4:IF SC+LIN-1=LINES+1 THEN 4690
- 5360 MID$(SCN$(SC+LIN-1),CP,LEN(SBOX$(1)))=SBOX$(LIN) 'store in scn$
- 5380 NEXT LIN
- 5400 GOSUB 3870:RETURN
- 20000 '=================================================================
- 20010 '*error handler
- 20020 '=================================================================
- 20030 IF ERL<>5050 THEN 20200
- 20040 CP=POS(0):CL=CSRLIN:LOCATE 25,1:INPUT "Printer error-quit printing (y or n)";ANS$
- 20050 GOSUB 2170:LOCATE CL,CP:IF ANS$="Y" OR ANS$="y" THEN RESUME 5080
- 20060 RESUME 5050
- 20200 IF ERL<>470 THEN 20400 'input open errors
- 20220 CP=POS(0):CL=CSRLIN:LOCATE 25,1:INPUT "Input open error-abort(Y or N)";ANS$
- 20230 GOSUB 2170:LOCATE CL,CP:IF ANS$="Y" OR ANS$="y" THEN RESUME 570
- 20240 RESUME 470
- 20400 IF ERL<>530 THEN 20600 'input read errors
- 20420 CP=POS(0):CL=CSRLIN:LOCATE 25,1:INPUT;"Input read error-abort (y or n)";ANS$
- 20430 GOSUB 2170:LOCATE CL,CP:IF ANS$="Y" OR ANS$="y" THEN RESUME 570
- 20440 RESUME 530
- 20600 IF ERL<>1570 THEN 20800 'output open errors
- 20620 CP=POS(0):CL=CSRLIN:LOCATE 25,1:INPUT;"Output open error-abort (Y or N)";ANS$
- 20630 GOSUB 2170:LOCATE CL,CP:IF ANS$="Y" OR ANS$="y" THEN RESUME 1690
- 20640 RESUME 1570
- 20800 IF ERL<> 1650 THEN 20900 'output write errors
- 20820 CP=POS(0):CL=CSRLIN:LOCATE 25,1:INPUT;"Write error-abort (Y or N)";ANS$
- 20830 GOSUB 2170:LOCATE CL,CP:IF ANS$="Y" OR ANS$="y" THEN RESUME 1690
- 20840 RESUME 1650
- 20900 ON ERROR GOTO 0
-